#include "pvid_authority.h"

PVID_Authority::PVID_Authority()
{}

PVID_Authority::~PVID_Authority(){}

PVID_Authority::PVID_Authority(QString Dir)
{
    obj_Dir.setPath(Dir);
    if(QSqlDatabase::contains("PVIDconex"))
        QSqlDatabase::addDatabase("QSQLITE","PVIDconex");
}

void PVID_Authority::create_key(){
}

QString PVID_Authority::PVID_generation(QString Data,QString Key){
    string output;

    HMAC<SHA> h((const byte*)Key.toAscii().data(),Key.size());

    byte abMac[h.DIGESTSIZE];

    h.CalculateDigest(abMac,(const byte*)Data.toAscii().data(),Data.size());

    HexEncoder enc(new StringSink(output));
    enc.Put(abMac, h.DIGESTSIZE);
    enc.MessageEnd();

    return QString::fromStdString(output);
}

bool PVID_Authority::PVID_verification(QString PVID,QString filter){
// Crea la conexion al Padron Propuesta (PdnP)
    QSqlDatabase PVID_List = QSqlDatabase::database("PVIDconex",false);
    PVID_List.setDatabaseName(obj_Dir.absoluteFilePath("PVID_List.db"));
    if(!PVID_List.open()){
        return false;
        }

// Crea el modelo
    QSqlTableModel *PVIDmodel = new QSqlTableModel(0,PVID_List);
    PVIDmodel->setTable("list");
    PVIDmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    if(filter=="PVID1")
        PVIDmodel->setFilter(QString("PVID1 = '").append(PVID).append("'"));
    else if (filter=="PVID2")
        PVIDmodel->setFilter(QString("PVID2 = '").append(PVID).append("'"));
    else
        PVIDmodel->setFilter("");
    PVIDmodel->select();

    if(PVIDmodel->rowCount()==0){
        return false;
        }
    else{
        return true;}
}

void PVID_Authority::set_voted(QString PVID){
// Crea la conexion al Padron Propuesta (PdnP)
    QSqlDatabase PVID_List = QSqlDatabase::database("PVIDconex",false);
    PVID_List.setDatabaseName(obj_Dir.absoluteFilePath("PVID_List.db"));
    PVID_List.open();

// Crea el modelo
    QSqlTableModel *PVIDmodel = new QSqlTableModel(0,PVID_List);
    PVIDmodel->setTable("list");
    PVIDmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    PVIDmodel->setFilter(QString("PVID1 = '").append(PVID).append("'"));
    PVIDmodel->select();

    PVIDmodel->setData(PVIDmodel->index(0,PVIDmodel->fieldIndex("vote_saved")),"si");
    PVIDmodel->submitAll();
}

bool PVID_Authority::isVoted(QString PVID){
// Crea la conexion al Padron Propuesta (PdnP)
    QSqlDatabase PVID_List = QSqlDatabase::database("PVIDconex",false);
    PVID_List.setDatabaseName(obj_Dir.absoluteFilePath("PVID_List.db"));
    PVID_List.open();

// Crea el modelo
    QSqlTableModel *PVIDmodel = new QSqlTableModel(0,PVID_List);
    PVIDmodel->setTable("list");
    PVIDmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    PVIDmodel->setFilter(QString("PVID1 = '").append(PVID).append("'"));
    PVIDmodel->select();

    if(PVIDmodel->record(0).value("vote_saved").toString()=="si")
        return true;
    else
        return false;
}
